<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>浅拷贝和深拷贝</title>
	</head>
	<body>
		<script>
			let obj = {
				id: 1,
				name: 'andy',
				message: {
					age: 18,
				},
			};
			let o = {};
			// for (let k in obj) {
			// 	// k 是属性名   obj[k] 是属性值
			// 	o[k] = obj[k];
			// }
			// console.log(o);
			// o.message.age = 20;
			// console.log(obj);

			// 可以不用 for in, 使用浅拷贝语法糖 assign, 也是浅拷贝
			// Object.assign(o, obj);
			// console.log(o);
			// o.message.age = 20;
			// console.log(obj);

			// 深拷贝
			// 封装函数
			function deepCopy(newobj, oldobj) {
				for (let k in oldobj) {
					// 判断属性值属于哪种数据类型
					// 1. 获取数据类型 oldobj[k]
					let item = oldobj[k];
					// 2. 判断这个值是否是数组
					if (item instanceof Array) {
						newobj[k] = [];
						deepCopy(newobj[k], item);
					} else if (item instanceof Object) {
						// 3. 判断这个值是否是对象
						newobj[k] = {};
						deepCopy(newobj[k], item);
					} else {
						// 4. 属于简单数据类型
						newobj[k] = item;
					}
				}
			}

			deepCopy(o, obj);
			console.log(o);
			o.message.age = 20;
			console.log(obj);
		</script>
	</body>
</html>
